/*
 * Cliente.java
 *
 * Created on October 7, 2007, 10:50 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package petstore.model;

import petstore.model.enumeration.Sexo;
import petstore.model.enumeration.TipoCliente;
import petstore.model.enumeration.Qualificacao;
import java.util.Collection;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Entity class Cliente
 * 
 * @author Tom Hayden
 */
@Entity
@Table(name = "cliente")
@AttributeOverrides( {
        @AttributeOverride(name="id", column=@Column(name="cdcliente")),
        @AttributeOverride(name="description", column=@Column(name="nmcliente")),
        @AttributeOverride(name="active", column=@Column(name="ativo"))
    })
public class Cliente extends CodeData {

    @Column(name = "dtcadastro")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;

    @Column(name = "dtnascimento")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;

    @Column(name = "sexo")
    @Enumerated(EnumType.STRING)
    private Sexo sexo;

    @Column(name = "tpcliente")
    @Enumerated(EnumType.ORDINAL)
    private TipoCliente tipoCliente;

    @Column(name = "qualificacao")
    @Enumerated(EnumType.ORDINAL)
    private Qualificacao qualificacao;

    @Column(name = "email")
    private String email;

    @Column(name = "site")
    private String site;

    @Column(name = "cpf")
    private String CPF;

    @Column(name = "rg")
    private String RG;

    @Column(name = "orgaoexpedidor")
    private String orgaoExpedidor;

    @OneToMany(cascade = CascadeType.ALL)
    private Collection<Animal> animais;

    @ManyToOne
    @JoinColumn(name="cdativprofissional")
    private AtividadeProfissional atividadeProfissional;

    @ManyToOne
    @JoinColumn(name = "cduf")
    private UF ufNaturalidade;
    
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="cliente_telefone",
               joinColumns={@JoinColumn(name="cdcliente", referencedColumnName="cdcliente")},
               inverseJoinColumns={@JoinColumn(name="cdtelefone", referencedColumnName="cdtelefone")})
    private Collection<Telefone> telefones;
    
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="cliente_endereco",
               joinColumns={@JoinColumn(name="cdcliente", referencedColumnName="cdcliente")},
               inverseJoinColumns={@JoinColumn(name="cdendereco", referencedColumnName="cdendereco")})
    private Collection<Endereco> enderecos;


    /** Creates a new instance of Cliente */
    public Cliente() {
    }

    public Cliente(Integer id) {
        super(id);
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public TipoCliente getTipoCliente() {
        return tipoCliente;
    }

    public void setTipoCliente(TipoCliente tipoCliente) {
        this.tipoCliente = tipoCliente;
    }

    public Qualificacao getQualificacao() {
        return qualificacao;
    }

    public void setQualificacao(Qualificacao qualificacao) {
        this.qualificacao = qualificacao;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public String getCPF() {
        return CPF;
    }

    public void setCPF(String CPF) {
        this.CPF = CPF;
    }

    public String getRG() {
        return RG;
    }

    public void setRG(String RG) {
        this.RG = RG;
    }

    public String getOrgaoExpedidor() {
        return orgaoExpedidor;
    }

    public void setOrgaoExpedidor(String orgaoExpedidor) {
        this.orgaoExpedidor = orgaoExpedidor;
    }

    public Collection<Animal> getAnimais() {
        return animais;
    }

    public void setAnimais(Collection<Animal> animais) {
        this.animais = animais;
    }

    public AtividadeProfissional getAtividadeProfissional() {
        return atividadeProfissional;
    }

    public void setAtividadeProfissional(AtividadeProfissional atividadeProfissional) {
        this.atividadeProfissional = atividadeProfissional;
    }

    public UF getUfNaturalidade() {
        return ufNaturalidade;
    }

    public void setUfNaturalidade(UF ufNaturalidade) {
        this.ufNaturalidade = ufNaturalidade;
    }

    public Collection<Telefone> getTelefones() {
        return telefones;
    }

    public void setTelefones(Collection<Telefone> telefones) {
        this.telefones = telefones;
    }

    public Collection<Endereco> getEnderecos() {
        return enderecos;
    }

    public void setEnderecos(Collection<Endereco> enderecos) {
        this.enderecos = enderecos;
    }

}
